perm filename MS[DOC,TOB] blob
sn#231114 filedate 1976-08-12 generic text, type T, neo UTF8
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; Stereo Disparity by a Cooperative Method -- 2-dimensional image ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
;;; Input images binary, fixnum, 100*100 (0 or 1) and are held in LEFT and RIGHT
;;; Disparity bindings are held in the array ADISP
;;; and their initial values are held in INITIALDISP
;;;
;;; To load the network, call (LOADDISP). To run it, call
;;; (RUNI N 'name), which runs the system through N iterations using information about
;;; the initial conditions on every iteration. Output is stored under filenames
;;; derived from <name>.
;;;
(DECLARE (ARRAY* (FLONUM ADISP 3. NEWDISP 3.)
(FIXNUM LEFT 2. RIGHT 2. SHOW 2. VIEW 2.))
(*LEXPR P Q))
(DECLARE (FIXNUM L R DISP)
(FLONUM VALUE))
(DECLARE (SPECIAL SIGMOID-SLOPE SIGMOID-THRESHOLD)
(FLONUM VALUE SIGMOID-SLOPE SIGMOID-THRESHOLD (SIGMOID FLONUM)))
(DEFUN SIGMOID (VALUE)
(COND ((< VALUE SIGMOID-THRESHOLD) 0.0)
(T (MIN 1.0 (*$ SIGMOID-SLOPE (-$ VALUE SIGMOID-THRESHOLD))))))
(DECLARE (SPECIAL EPSILON M)
(FLONUM EPSILON VALUE)
(FIXNUM XL YX XR M UL K DISP XD YD)
(NOTYPE NBD ELS EL))
(SETQ M 5 EPSILON 2.0 SIGMOID-SLOPE 1.0 SIGMOID-THRESHOLD 3.0)
(DECLARE (FLONUM INITIALVALUE))
(DEFUN FASTNEWVALUEI (XL YL XR INITIALVALUE NBD)
;;; uses initial values -- have to extract them each time as
;;; there is no room in core for a copy of the initial array
(PROG (VALUE DISP EL XD YD UL)
(SETQ VALUE 0.0 DISP (- XR XL -3))
;;; pick up excitation
(DO ELS NBD (CDR ELS) (NULL ELS)
(SETQ EL (CAR ELS)
XD (CAR EL)
YD (CADR EL))
(SETQ VALUE (+$ VALUE
(ADISP (+ XL XD) (+ YL YD) DISP))))
;;; pick up inhibition parallel to RIGHT axis
(SETQ UL (+ XR 4))
(DO K (- XR 3) (1+ K) (= K UL)
(SETQ VALUE (-$ VALUE (*$ EPSILON (ADISP K YL (- XR K -3))))))
;;; now parallel to LEFT axis
(SETQ UL (+ XL 4))
(DO K (- XL 3) (1+ K) (= K UL)
(SETQ VALUE (-$ VALUE (*$ EPSILON (ADISP XL YL (- K XL -3))))))
;;; don't want to subtract itself twice
;;; also add in starting conditions
(SETQ VALUE (+$ VALUE INITIALVALUE (*$ 2.0 EPSILON (ADISP XL YL DISP))))
(STORE (NEWDISP XL YL DISP) (SIGMOID VALUE))
(RETURN T)))
(DECLARE (FIXNUM I J LEFTEYE RIGHTEYE Y))
(DEFUN LOADDISP NIL
;;; loads the initial DISP array from data arrays LEFT and RIGHT
(PROG (LEFTEYE RIGHTEYE)
(FILLARRAY 'ADISP '(0.0))
(DO Y 3 (1+ Y) (= Y 97.)
(DO I 3 (1+ I) (= I 97.)
(COND ((= (LEFT I Y) 0.) (GO CONTINUE))
(T (SETQ LEFTEYE I)))
(DO J -3 (1+ J) (= J 4.)
(SETQ RIGHTEYE (+ LEFTEYE J))
(COND ((= (RIGHT RIGHTEYE Y) 1.)
(STORE (ADISP LEFTEYE Y (+ J 3)) 1.0))))
CONTINUE))))
(DECLARE (SPECIAL DISPLAY-FLAG)
(FIXNUM M-BY-2)
(NOTYPE DISPLAY-FLAG FN))
(SETQ DISPLAY-FLAG T)
(DECLARE (ARRAY* (NOTYPE CIRCLE 1.)))
(DECLARE (SPECIAL INPUT-CONTRIBUTION SHOWFLAG XGPFLAG PWFLAG FIRST-XGP LAST-XGP)
(FLONUM INPUT-CONTRIBUTION IVAL INITIALVALUE)
(NOTYPE LEFTFLAG FN SHOWFLAG XGPFLAG)
(NOTYPE (FASTNEWVALUEI FIXNUM FIXNUM FIXNUM FLONUM NOTYPE)))
(SETQ INPUT-CONTRIBUTION 1.0)
(DEFUN RUNI (N FN)
;;; uses initial data each iteration
(PROG (UL M-BY-2 NBD INITIALVALUE IVAL LEFTFLAG AUTOTHRESH)
(SETQ FIRST-XGP T LAST-XGP NIL)
(P '(SHALL I SAVE SHOW EACH ITERATION?))
(SETQ SHOWFLAG (Q))
(P '(SHALL I CREATE AN XGP IMAGE FOR EACH ITERATION?))
(SETQ XGPFLAG (Q))
(SETQ DISPLAY-FLAG (OR SHOWFLAG XGPFLAG))
(P '(SHALL I CREATE A PHOTOWRITER FILE FOR EACH ITERATION?))
(SETQ PWFLAG (Q))
(SETQ IVAL INPUT-CONTRIBUTION)
(SETQ M-BY-2 (// M 2))
(SETQ NBD (CIRCLE M-BY-2))
(AND PWFLAG (PW-DSPLY FN 0.))
(AND DISPLAY-FLAG (DSPLY FN 0.) (P 'INITIAL 'STATE))
(SETQ FIRST-XGP NIL)
(P 'SHALL 'I 'SET 'SIGMOID-THRESHOLD 'AUTOMATICALLY?)
(COND ((SETQ AUTOTHRESH (Q))
(P 'PARAMETERS 'ARE 'M '= M 'EPSILON '= EPSILON
'INPUT-CONTRIBUTION '= IVAL)
(P 'SIGMOID-THRESHOLD '= 'AUTOMATIC
'SIGMOID-SLOPE '= SIGMOID-SLOPE))
(T (P 'PARAMETERS 'ARE 'M '= M 'EPSILON '= EPSILON
'INPUT-CONTRIBUTION '= IVAL)
(P 'SIGMOID-THRESHOLD '= SIGMOID-THRESHOLD
'SIGMOID-SLOPE '= SIGMOID-SLOPE)))
(DO K 0 (1+ K) (= K N)
;;; if last iteration, say so
(SETQ LAST-XGP (= K (1- N)))
;;; if on automatic threshold mode, set
;;; sigmoid-threshold at each iteration
(COND (AUTOTHRESH (SET-SIGMOID-THRESHOLD)))
(DO Y 4 (1+ Y) (= Y 96.)
(DO I 6 (1+ I) (= I 94.)
;;; set flag if there is a 1 in the left image
(SETQ LEFTFLAG (= (LEFT I Y) 1.))
(SETQ UL (+ I 4))
;;; for speed, write two copies of code to avoid repeated test
(COND (LEFTFLAG (DO J (- I 3) (1+ J) (= J UL)
(COND ((= (RIGHT J Y) 1.)
(SETQ INITIALVALUE IVAL))
(T (SETQ INITIALVALUE 0.0)))
(FASTNEWVALUEI I Y J INITIALVALUE NBD)))
(T (DO J (- I 3) (1+ J) (= J UL)
(FASTNEWVALUEI I Y J 0.0 NBD))))))
(FILLARRAY 'ADISP 'NEWDISP)
(AND DISPLAY-FLAG (DSPLY FN (1+ K)))
(AND PWFLAG (PW-DSPLY FN (1+ K)))
(P 'ITERATION (1+ K) 'DONE '(using initial values)))))
(DECLARE (FLONUM VALUE)
(FIXNUM I J K))
(DEFUN SET-SIGMOID-THRESHOLD NIL
(PROG (VALUE)
(SETQ VALUE 0.0)
;;; find average value in a sample of adisp
(DO K 0 (1+ K) (= K 7.)
(DO J 15. (1+ J) (= J 55.)
(DO I 15. (1+ I) (= I 55.)
(SETQ VALUE (+$ VALUE (ADISP I J K))))))
(SETQ VALUE (//$ VALUE 11200.0))
;;; value is the average activity in the network at this point
(P 'AVERAGE 'ACTIVITY 'IS VALUE)
(COND ((< VALUE 0.07) (SETQ SIGMOID-THRESHOLD 1.0))
((< VALUE 0.11) (SETQ SIGMOID-THRESHOLD 2.0))
(T (SETQ SIGMOID-THRESHOLD 3.0)))
(P 'SIGMOID-THRESHOLD 'SET 'AT SIGMOID-THRESHOLD)
(RETURN T)))
(DECLARE (FLONUM VALUE DISPFL V WT)
(SPECIAL WINDOW))
(SETQ WINDOW '((0 0) (99. 99.)))
(SETQ TTYSEE-FUNCTION 'SHOW)
(DEFUN DSPLY (FN ITERATION)
(PROG (DISP VALUE V WT)
;;; normalisation
(FILLARRAY 'SHOW '(30.))
(DO XL 6 (1+ XL) (= XL 94.)
(DO YL 4 (1+ YL) (= YL 96.)
(SETQ DISP 0 VALUE 0.0 WT 0.0)
(DO DISPFL 0.0 (1+$ DISPFL) (= DISPFL 7.0)
(SETQ V (ADISP XL YL DISP)
WT (+$ WT V)
VALUE (+$ VALUE (*$ DISPFL V)))
(SETQ DISP (1+ DISP)))
(STORE (SHOW XL YL) (FIX (//$ (*$ VALUE 10.0) WT)))))
(AND XGPFLAG (XGPSHOW ITERATION FN))
(AND SHOWFLAG (DUMPARRAYS '(SHOW) (LIST FN '> 'DSK 'MARR)))
(RETURN T)))
(DEFUN PW-DSPLY (FN ITERATION)
(PROG (DISP VALUE V WT)
;;; normalisation
(FILLARRAY 'VIEW '(120.))
(DO XL 6 (1+ XL) (= XL 94.)
(DO YL 4 (1+ YL) (= YL 96.)
(SETQ DISP 0 VALUE 0.0 WT 0.0)
(DO DISPFL 0.0 (1+$ DISPFL) (= DISPFL 7.0)
(SETQ V (ADISP XL YL DISP)
WT (+$ WT V)
VALUE (+$ VALUE (*$ DISPFL V)))
(SETQ DISP (1+ DISP)))
(STORE (VIEW (+ 14. XL) (+ 14. YL))
(FIX (//$ (*$ VALUE 40.0) WT)))))
(PICTURE 'VIEW (LIST (IMPLODE (CONS 'P (EXPLODE FN))) ITERATION 'AI 'MARR))
(RETURN T)))
βββ